Jak na stahovani dat v TCP/IP se Synapsi?

Otázka od: Petr Brant

28. 11. 2003 10:21

Ahoj vespolek, uz nejakou dobu provozuji konstrukci, ktera bez problemu
funguje. Jedna se o stahovani dat z nejakeho serveru pres TCP/IP. Zabalil
jsem Synapsi do sve tridy a ta konstrukce (odnekud jsem ji opsal)
zjednodusene vypada takto:

 Sock.SendString(Send); //posle se vyzva
 
 if Sock.CanRead(Timeout) then
 begin
  if Sock.WaitingData > 0 then //pokud prisla odezva...
  begin
   FillChar(Buffer, MaxBufLength + 1, 0);
   Sock.recvBuffer(@Buffer, MaxBufLength );
 ...
 end;

Vsechno funguje, objem prenasenych dat je vsak velmi maly, nejvyse stovky
bytu.
Ted jsem zkusil pouzit tutez konstrukci na jiny server, ktery poskytuje
objemnejsi data (tisice bytu) a zde mi jich prijde jenom cast, pokud vsak
mezi prvni dva radky vyse zmineneho kodu vlozim cekaci smycku (2 sekundy),
prijdou data cela. Nejsem zadny odbornik na komunikaci, proto bych se rad
zeptal, jestli je chyba v mem kodu nebo zda je jina pricina a jak by asi
vypadalo reseni. Budu vdecny nejen za radu, ale pripadne i kousek kodu.

Diky a zdravim vsechny

RNDr. Petr Brant [brant@dcomm.cz]
http://web.redbox.cz/petr.brant




----------
* www.inMail.sk - Vasa emailova adresa na cely zivot ZDARMA
* Mail neobsahuje virusy. Zkontrolovane antivirusom NOD32 (www.eset.sk)
* www.SlovakNET.sk - profesionalny webhosting, domena .SK ZADARMO
* Zoner Media Explorer 5 - stiahnite si pomocnika pre digitalnu fotografiu
(zme.zoner.sk)

Odpovedá: Lukas Gebauer

28. 11. 2003 10:53

> if Sock.CanRead(Timeout) then
> begin
> if Sock.WaitingData > 0 then //pokud prisla odezva...
> begin
> FillChar(Buffer, MaxBufLength + 1, 0);
> Sock.recvBuffer(@Buffer, MaxBufLength );
> ...
> end;
>
> Vsechno funguje, objem prenasenych dat je vsak velmi maly, nejvyse
> stovky bytu. Ted jsem zkusil pouzit tutez konstrukci na jiny server,
> ktery poskytuje objemnejsi data (tisice bytu) a zde mi jich prijde
> jenom cast, pokud vsak mezi prvni dva radky vyse zmineneho kodu vlozim
> cekaci smycku (2 sekundy), prijdou data cela. Nejsem zadny odbornik na
> komunikaci, proto bych se rad zeptal, jestli je chyba v mem kodu nebo
> zda je jina pricina a jak by asi vypadalo reseni. Budu vdecny nejen
> za radu, ale pripadne i kousek kodu.

To proto, ze touto kontrukci prijmes jen prvni prisla data... ty ale
mohou prichazet ve vice packetech postupne. kdyz pockas, packety se
ti zatim nahromadi v bufferu, a proto je pak prectes.

Nicmene spravne cteni musi pocitat s tim, ze na jedno cteni nemusis
precist vsechna data. Musis se podiva, jestli neco chybi, a pripadne
cteni zopakovat.

Situace je ale snadnejsi, nez cekas... tvuj cteci kod zahod. Misto
toho pouzij uz hotove funkce, ktere vsechny tyhle problemy resi
uvnitr Synapse.

Podivej se na funkce:

RecvString - cte data dokud nenajde odradkovani
RecvTerminated - cte data, dokud se nevyskytne tebou zadana sekvence
RecvBuffStr - cte tebou zadany pocet bytu dat
RecvPacket - cte vse, co je prave k dispozici v bufferu

To, co jsi mel naprogramovane ty, to bylo vlastne totez, jako kdybys
volal rovnou TRecvPacket. jamile zjistis, ze data nejsou vsechna,
musis volani teto funkce opakovat tak dlouho, dokud nejsou spokojen.

Ale obecne, kdyz ctes nejaka data, tak vis, jak vypada komunkacni
protokol, tedy vis, jak vypadaji ctena data! Vis, jestli je tam
nejaky zakoncovaci znak, nebo vis jestli se jedna o pevny poct znaku,
atd.

Pochopitelne to muzes libovolne kombinovat. Muzes si precist treba
radek dat, ze kterych se dozvis delku nasledujiciho bloku dat.. a tu
pak prectes funkci pro precteni pevneho poctu bytu, atd.

--
Lukas Gebauer.

E-mail: gebauerl@mlp.cz
http://www.ararat.cz/synapse/ - Ararat Synapse - TCP/IP Lib.





----------
* www.inMail.sk - Vasa emailova adresa na cely zivot ZDARMA
* Mail neobsahuje virusy. Zkontrolovane antivirusom NOD32 (www.eset.sk)
* www.SlovakNET.sk - profesionalny webhosting, domena .SK ZADARMO
* Zoner Media Explorer 5 - stiahnite si pomocnika pre digitalnu fotografiu
(zme.zoner.sk)